package com.lanyou.cook.camel.util;

import java.util.regex.Pattern;
import java.util.regex.Matcher;

import org.apache.camel.component.file.GenericFile;
import org.apache.camel.component.file.GenericFileFilter;

/**
 * 根据文件名规则过滤下载ftp目录下的文件
 * 
 * @author ly-lihailang
 *
 * @param <T>
 */
public class FtpFileFilter<T> implements GenericFileFilter<T> {

	/**
	 * 使用正则表达式过滤时uri里的正则表达式
	 */
	String regex = "";

	/**
	 * 使用文件名匹配时uri里的文件名
	 */
	String fileNameStr = "";

	public FtpFileFilter() {
	}

	public FtpFileFilter(String regex) {
		this.regex = regex;
	}

	@Override
	public boolean accept(GenericFile<T> file) {
		boolean result = false;
		// camel-ftp遍历的文件名
		String fileName = file.getFileName();
		// 如果文件名不为空，按文件名匹配
		if (!fileNameStr.equals("")) {
			result = fileInFileNames(fileName, fileNameStr);
		} else if (!regex.equals("")) {// 否则如果正则表达式不为空，则按正则表达式匹配
			if(regex.indexOf(",") != -1){
				//匹配多个正则表
				String[] regexs = regex.split(",");
				for (String rege : regexs) {
					if(rege.indexOf("*") != -1){
						rege = rege.replace(".", "\\.");
						String reg = "((?!\\.).)+";
						rege = "^" + rege.replace("*", reg) + "$";
						result = matchRegex(fileName, rege);
						if(result){
							return true;
						}
					}
				}
			}else{
				//匹配一个正则表达式
				String mRegex = "";
				mRegex = regex.replace(".", "\\.");
				String reg = "((?!\\.).)+";
				mRegex = "^" + mRegex.replace("*", reg) + "$";
				result = matchRegex(fileName, mRegex);
			}
			
		}
		return result;
	}
	
	


	/**
	 * 按正则表达式匹配文件名
	 * 
	 * @param fileName
	 *            文件名
	 * @param regex
	 *            正则表达式
	 * @return 匹配结果
	 */
	private boolean matchRegex(String fileName, String regex) {
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(fileName);
		return matcher.matches();
	}

	/**
	 * 按指定文件名匹配
	 * 
	 * @param fileName
	 *            文件名
	 * @param fileNameStr
	 *            指定文件名
	 * @return 匹配结果
	 */
	private boolean fileInFileNames(String fileName, String fileNameStr) {
		if (fileNameStr.indexOf(fileName) > -1) {
			return true;
		}
		return false;
	}

	public String getRegex() {
		return regex;
	}

	public void setRegex(String regex) {
		this.regex = regex;
	}

	public String getFileNameStr() {
		return fileNameStr;
	}

	public void setFileNameStr(String fileNameStr) {
		this.fileNameStr = fileNameStr;
	}

	/*public static void main(String[] args) {
		Pattern pattern = Pattern.compile("^re.*");
		String fileName = ("report.txt");
		System.out.println(fileName);
		Matcher matcher = pattern.matcher(fileName);
		System.out.println(matcher.matches());
	}*/
}
